#ifndef NETASSIST_H
#define NETASSIST_H

#include <QMainWindow>
#include <QDebug>
#include <QString>
#include <QUdpSocket>
#include <QNetworkInterface>
#include <QVector>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDateTime>
#include <QMessageBox>
#include <QTimer>
#include <QFile>
#include <QFileDialog>
#include <QTextStream >

QT_BEGIN_NAMESPACE
namespace Ui { class NetAssist; }
QT_END_NAMESPACE

class NetAssist : public QMainWindow
{
    Q_OBJECT

public:
    NetAssist(QWidget *parent = nullptr);
    ~NetAssist();

    // 获取本地 ip 地址
    void Get_Ip();

    // UDP 绑定
    void UDP_Bind();

    // UDP 发送信息
    void UDP_Send();

    // TCP 客户端初始化
    void TCP_Client_Init();

    // TCP 客户端发送信息
    void TCP_Client_Send();

    // TCP 服务器初始化
    void TCP_Server_Init();

    // TCP 服务器发送信息
    void TCP_Server_Send();

    // 字符串转换十六进制
    QString String_To_Hex(QString Data);

    // 根据网络类型发送信息
    void NetType_Send();

    // 根据功能显示接收信息
    void Function_Display(QString str);

    // 拼接 ip 地址与端口号
    QString Joint_Ip_Port(QTcpSocket *Socket);

    // 文件载入处理
    void Read_File_Data();

    // 启用文件数据源处理
    void Send_File_Data();

    // 保存数据处理
    void Write_File_Data();

    // 接收转向文件处理
    void Recv_File_Data();

private slots:
    // 下拉列表框 选择协议类型
    void on_comboBox_NetType_currentIndexChanged(int index);

    // 连接按钮
    void on_pushButton_ConnectBreak_clicked();

    // 发送按钮
    void on_pushButton_Send_clicked();

    // UDP 接收信息
    void UDP_Recv();

    // TCP 客户端接收信息
    void TCP_Client_Recv();

    // 新的客户端连接服务器
    void New_Client_Connect();

    // TCP 服务器接收信息
    void TCP_Server_Recv();

    // 客户端断开连接
    void Client_Break_Connect();

    // 清除接收区
    void on_pushButton_ClearRecv_clicked();

    // 清除发送区
    void on_pushButton_ClearSend_clicked();

    // 自动换行显示
    void on_checkBox_clicked();

    // 十六进制显示
    void on_checkBox_HexDisplay_clicked();

    // 下拉列表框 选择远程主机 ip 地址与端口号
    void on_comboBox_IpPort_currentTextChanged(const QString &arg1);

    // 清除下拉列表框 选择远程主机 ip 地址与端口号
    void on_pushButton_Clear_clicked();

    // 十六进制发送
    void on_checkBox_HexSend_clicked();

    // 复位计数
    void on_pushButton_ResetCount_clicked();

    // 显示接收时间
    void on_checkBox_TimeDisplay_clicked();

    // 暂停接收显示
    void on_checkBox_StopDisplay_clicked();

    // 循环周期发送
    void on_checkBox_SendTime_clicked();

    // 获取发送周期时间
    void on_lineEdit_SendTime_textEdited(const QString &arg1);

    // 循环周期发送处理
    void Time_Send();

    // 文件载入
    void on_pushButton_SendData_clicked();

    // 接收文本框自动往下滚动
    void on_textEdit_Recv_textChanged();

    // 发送文本框自动往下滚动
    void on_textEdit_Send_textChanged();

    // 启用文件数据源
    void on_checkBox_SendFile_clicked();

    // 保存数据
    void on_pushButton_SaveData_clicked();

    // 接收转向文件
    void on_checkBox_RecvFile_clicked();

private:
    Ui::NetAssist *ui;

    // 协议类型
    int _NetType;

    // 发送计数
    ulong _TX_Count;

    // 接收计数
    ulong _RX_Count;

    // 本地主机 IP 地址
    QString _MyIp;

    // 远程主机 IP 地址
    QString _Ip;

    // 上一次发送者的 ip 地址与端口号
    QString _Last_IpPort;

    // 十六进制发送字符串
    QString _Hex_Send_Str;

    // 发送周期时间
    QString _Send_Time;

    // 发送文件数据
    QByteArray _Send_File_Data;

    // 接收文件数据
    QString _Recv_File_Data;

    // 本地主机端口号
    quint16 _MyPort;

    // 远程主机端口号
    quint16 _Port;

    // 接收转向文件对象
    QString _Recv_FileName;

    // 远程主机 ip 地址与端口号容器
    QVector<QString> _IpPort;

    // 客户端容器
    QVector<QTcpSocket *> _All_ClientSocket;

    // 连接按钮状态
    bool _Flag_Port_ConnectBreak;

    // 自动换行按钮状态
    bool _Flag_Auto_Line;

    // 十六进制显示按钮状态
    bool _Flag_Hex_Display;

    // 十六进制发送按钮状态
    bool _Flag_Hex_Send;

    // 显示接收时间按钮状态
    bool _Display_Time;

    // 暂停接收显示
    bool _Stop_Display;

    // 循环周期发送
    bool _Loop_Send;

    // 启用文件数据源
    bool _Send_File;

    // 保存数据
    bool _Save_Data;

    // 接收文件转向
    bool _Recv_File;

    // 群发标志位状态
    bool _Group_Send;

    // 远程 ip 地址与端口号状态
    bool _flag_IpPort;

    // 发送按钮状态
    bool _Send;

    // 创建时间对象
    QTimer *_Timer;

    // UDP 发送套接字
    QUdpSocket *_UdpSocketSend;

    // UDP 接收套接字
    QUdpSocket *_UdpSocketRecv;

    // TCP 客户端套接字
    QTcpSocket *_TcpClientSocket;

    // TCP 服务器套接字
    QTcpServer *_TcpServerSocket;
};

// 网络协议类型枚举
enum{
    UDP         = 0,
    TCPClient   = 1,
    TCPServer   = 2
};
#endif // NETASSIST_H
